#include <iostream>
using std::cout;
using std::endl;

class FunctionObject{
public:
    //第一个括号表示运算符（函数调用运算符）
    //第二个括号表示参数列表（无参形式）
    int operator()(){
        cout << "int operator()()" << endl;
        ++_cnt;
        return 1;
    }

    //可以定义多种函数调用运算符重载函数
    void operator()(int x){
        cout << "void operator(int)" << endl;
        ++_cnt;
        cout << x << endl;
    }

    int _cnt = 0;
};

int cnt = 0; 
void print(){
    //static int cnt = 0; 
    cout << "hello" << endl;
    ++cnt;
}

void test0(){
    FunctionObject fo; //无参构造
    //声明了一个返回值为FunctionObject对象的函数，函数名是fo2
    //FunctionObject fo2(); 
    
    //无参构造创建堆上对象
    //FunctionObject * p = new FunctionObject();

    cout << fo() << endl;  //让对象像一个函数一样被调用
    //第一个括号应该与operator连在一起看，作为函数名
    //fo这个对象调用了operator()这个函数
    //第二个括号是函数调用的形式
    cout << fo.operator()() << endl;

    fo(5);
    fo.operator()(5);

    cout << "use count:" << fo._cnt << endl;


    print();
    print();
    print();
    cout << cnt << endl;
}


int main(void){
    test0();
    return 0;
}
